#include <iostream>
#include <unistd.h>
#include <cstdio>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void PrintPending(sigset_t& pending)
{
    std::cout << "current process[" << getpid() << "]的pending: ";
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void handler(int signum)
{
    std::cout << signum << "号信号被递达!!!" << std::endl;
    std::cout << "-----------------------" << std::endl;
    sigset_t pending;
    sigpending(&pending);
    PrintPending(pending);
    std::cout << "-----------------------" << std::endl;
}

int main()
{
    // 0.捕捉2号信号
    signal(2, handler);

    // 1.屏蔽2号信号
    sigset_t block_set, old_set;
    // 将信号集初始化为没有任何信号
    sigemptyset(&block_set);    
    sigemptyset(&old_set);
    // 给block_set信号集添加2号信号
    sigaddset(&block_set, SIGINT);
    // 将信号集合设置到进程的block表中，修改当前进程的内核block表，完成对2号信号的屏蔽
    // 并且将原先进程的信号集给到old_set中
    sigprocmask(SIG_BLOCK, &block_set, &old_set);

    int cnt = 15;
    while(true)
    {
        // 2.获取当前进程的pending信号集
        sigset_t pending;
        sigpending(&pending);

        // 3.打印pending信号集
        PrintPending(pending);
        cnt--;

        // 4.解除对2号信号的屏蔽
        if (cnt == 0)
        {
            std::cout << "解除对2号信号的屏蔽!!!" << std::endl;
            // 将原先的信号集合（没有任何信号）,设置掩码
            // 就是不给任何信号设置掩码，等于解除任何信号的信号屏蔽字
            sigprocmask(SIG_SETMASK, &old_set, &block_set);
        }

        sleep(1);
    }

    return 0;
}